package io;

import java.util.Date;

/**
 * Clase que representa un feed, con sus atributos correspondientes.
 *
 * @author Nicolás Garay
 * @author Alejandro Jacquet
 * @author Rita Romani
 */
public class Feed {

    /** Atributo que representa el titulo del feed. */
    private String titulo;
    /** Atributo que representa la descripción del feed, la información que contiene. */
    private String descripcion;
    /** Atributo que representa el formato del feed (Ejemplo: text/html). */
    private String tipoDescripcion;
    /** Atributo que representa el autor del feed. */
    private String autor;
    /** Atributo que representa la url del feed, dirección para leer la noticia completa en un navegador. */
    private String url;
    /** Atributo que representa la fecha de publicación del feed. */
    private Date fechaPublicacion;
    /** Atributo que representa si el feed fue leído o no. */
    private boolean abierto;

    /**
     * Constructor de la clase, al crear una instancia inicializa los atributos
     * titulo, descripcion, tipoDescripcion, autor, url, fechaPublicacion,
     * abierto.
     *
     * @param titulo String titulo del feed
     * @param descripcion String descripción de la información del feed
     * @param tipoDescripcion String formato de la descripción
     * @param autor String autor del feed
     * @param url String dirección para leer la noticia completa
     * @param fechaPublicacion Date fecha de publicación del feed
     * @param abierto boolean especifica si el feed fue leído o no
     */
    public Feed(String titulo, String descripcion, String tipoDescripcion, String autor, String url, Date fechaPublicacion, boolean abierto) {
        this.titulo = valor(titulo, "Sin titulo");
        this.descripcion = valor(descripcion, "Sin Descripción");
        this.tipoDescripcion = valor(tipoDescripcion, "Sin Tipo de Descripción");
        this.autor = valor(autor, "Autor No Especificado");
        this.url = valor(url, "Sin URL");
        this.fechaPublicacion = fechaPublicacion;
        this.abierto = abierto;
    }

    /**
     * Método que retorna el titulo del feed.
     *
     * @return String titulo del feed
     */
    public String getTitulo() {
        return this.titulo;
    }

    /**
     * Método que retorna la descripción de la información del feed.
     *
     * @return String descripción del feed
     */
    public String getDescripcion() {
        return this.descripcion;
    }

    /**
     * Método que retorna el formato de la descripción del feed.
     *
     * @return String tipo de descripción
     */
    public String getTipoDescripcion() {
        return this.tipoDescripcion;
    }

    /**
     * Método que retorna el autor del feed.
     *
     * @return String autor del feed
     */
    public String getAutor() {
        return this.autor;
    }

    /**
     * Método que retorna una dirección para leer la noticia completa en un
     * navegador.
     *
     * @return String url del feed
     */
    public String getURL() {
        return this.url;
    }

    /**
     * Método que retorna la fecha de publicación del feed.
     *
     * @return Date fecha de publicación del feed
     */
    public Date getFechaPublicacion() {
        return this.fechaPublicacion;
    }

    /**
     * Método que devuelve un String por defecto, pasado como parámetro, en caso
     * de que el Object value sea nulo o vacío.
     *
     * @param value Object valor actual
     * @param Default String cadena por defecto (para value nulo o vacío)
     * @return String valor actual o valor por defecto
     */
    private String valor(Object value, String Default) {
        String cadena = Default;
        if ((value != null) && value.toString().length() > 0) {
            cadena = value.toString();
        }
        return cadena;
    }

    /**
     * Método que retorna el valor del atributo abierto del feed.
     *
     * @return boolean abierto
     */
    public boolean isAbierto() {
        return abierto;
    }

    /**
     * Método que setea un valor para el atributo abierto del feed.
     *
     * @param abierto boolean
     */
    public void setAbierto(boolean abierto) {
        this.abierto = abierto;
    }

    /**
     * Método que permite comparar si un objeto Feed pasado como parámetro es
     * igual al objeto Feed que ejecuta el método. El criterio que usa en la
     * comparación es que el titulo, la descripcion y la url sean iguales.
     *
     * @param feed Feed
     * @return boolean que determina si son iguales o no
     */
    public boolean equals(Feed feed) {
        if (this.titulo.equals(feed.getTitulo()) && this.descripcion.equals(feed.getDescripcion()) && this.url.equals(feed.getURL())) {
            return true;
        } else {
            return false;
        }
    }
}